搜索 K
Appearance
博客正在加载中...
Appearance
现在我们来通过 AOP,完成一个数据库表的 CRUD 和事务控制
我们在讲解 AOP 之前,自己实现了 代理模式 ,现在我们基于当时的案例,来改造。读者也可以切换到分支 demo10,然后在其基础上开发。
我们加上 aspectj 的依赖,整体依赖如下:
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<!-- Spring IoC -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>commons-dbutils</groupId>
<artifactId>commons-dbutils</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.7</version>
</dependency>
</dependencies>以下包可以删掉:
删除 bean.xml 的配置:以下配置可以删掉
<!-- 配置代理的Service -->
<bean id="proxyAccountService" class="com.peterjxl.factory.BeanFactory" factory-bean="beanFactory" factory-method="getAccountService"/>
<!-- 配置BeanFactory -->
<bean id="beanFactory" class="com.peterjxl.factory.BeanFactory">
<property name="accountService" ref="accountService"/>
<property name="txManager" ref="txManager"/>
</bean>测试类中,删掉注入 IAccountService 时的 @Qualifier("proxyAccountService")。
由于我们使用了约束,因此得在 XML 中加上约束
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
然后我们配置 AOP
<!-- 配置AOP -->
<aop:config>
<aop:pointcut id="pt1" expression="execution(* com.peterjxl.service.impl.*.*(..))"/>
<aop:aspect id="txAdvice" ref="txManager">
<!-- 配置前置通知,开启事务 -->
<aop:before method="beginTransaction" pointcut-ref="pt1"/>
<!-- 配置后置通知,提交事务 -->
<aop:after-returning method="commit" pointcut-ref="pt1"/>
<!-- 配置异常通知,回滚事务 -->
<aop:after-throwing method="rollback" pointcut-ref="pt1"/>
<!-- 配置最终通知,释放连接 -->
<aop:after method="release" pointcut-ref="pt1"/>
</aop:aspect>
</aop:config>我们可以在 service 实现类中,测试有异常和无异常的情况下,数据库的数据变化情况,可以看到能正常开启了事务。
本项目已将源码上传到 GitHub 和 Gitee 上。并且创建了分支 demo15,读者可以通过切换分支来查看本文的示例代码